package servlet;

import entities.Documento;
import entities.Usuario;
import javax.ejb.EJB;
import javax.naming.NamingException;
import sessions.AltaBeanLocal;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import javax.naming.InitialContext;
import sessions.AltaBean;
import sessions.LoginBean;
import sessions.LoginBeanLocal;
import sessions.RecuperarFicheroBeanLocal;
import sessions.SubirFicheroBean;

public class Control extends HttpServlet {

    @EJB
    private AltaBeanLocal altaBean;
    @EJB
    private LoginBeanLocal loginBean;
    @EJB
    private SubirFicheroBean subirFicheroBean;
    @EJB
    private RecuperarFicheroBeanLocal recuperarFicheroBean;
    private static ServletContext sc;
    private static String WEBMASTER_EMAIL;
    private boolean depuracion;
    Usuario usuario = new Usuario();

    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        sc = this.getServletContext();
        // Obtener el email del webmaster del parametro del contexto y almacenarlo como variable global
        WEBMASTER_EMAIL = (String) sc.getInitParameter("WEBMASTER_EMAIL");
        // Establece el paramero inicial ServletDebug que determina si enviamos los mensajes a la consola
        String depuracionString = config.getInitParameter("ServletDebug");
        //System.out.println("Estamos en Control");
        if (depuracionString.equalsIgnoreCase("true")) {

            depuracion = true;
        } else {
            depuracion = false;
        }
        // Envia los parametros a la consola si esta activada la depuracion
        if (depuracion) {
            System.err.println("Recibido parametro de configuracion: WEBMASTER_EMAIL: " + WEBMASTER_EMAIL);
        }
    }

    protected void service(HttpServletRequest peticion, HttpServletResponse respuesta) throws ServletException, IOException {
        respuesta.setContentType("text/html");
        System.out.println("Estamos en Control");
        String operacion = peticion.getParameter("operacion");
        System.out.println(operacion);
        // recibe parametro que indica el tipo de operacion
        // si null, pone en operacion la cadena vacia
        if (operacion == null) {
            operacion = "";
        }
        System.err.println("Control servlet operacion --> " + operacion);
        // Evalua las diferentes tipos de operacion, llamando al metodo apropiado.
        //editarDatos
        if (operacion.equalsIgnoreCase("editarDatos")) {
            this.doEditarDatos(peticion, respuesta);
            return;
        }
        if (operacion.equalsIgnoreCase("logOut")) {
            this.doLogOut(peticion, respuesta);
            return;
        }
        if (operacion.equalsIgnoreCase("registrarse")) {
            System.out.println("registrarse");
            this.doAltaUsuario(peticion, respuesta);
            //this.doRegistrarse(peticion, respuesta);
            return;
        }
        if (operacion.equalsIgnoreCase("loginUsuario")) {
            //peticion.setAttribute(nombre_usuario, sc);
            this.doLogin(peticion, respuesta);
            return;
        }
        if (operacion.equalsIgnoreCase("altaUsuario")) {
            this.doAltaUsuario(peticion, respuesta);
            return;
        }
        if (operacion.equalsIgnoreCase("recordarPassword")) {
            this.doRecordarPassword(peticion, respuesta);
            return;
        }
        if (operacion.equalsIgnoreCase("subirFichero")) {
            this.doSubirFichero(peticion, respuesta);
            return;
        }
        if (operacion.equalsIgnoreCase("verFicheros")) {
            this.doVerFicheros(peticion, respuesta);
            return;
        }
        if (operacion.equalsIgnoreCase("descargarFichero")) {
            this.doDescargarFichero(peticion, respuesta);
            return;
        }
        if (operacion.equalsIgnoreCase("verMss")) {
            try {
                System.err.println("Control --> vamos doVerMss");
                this.doVerMensajes(peticion, respuesta);
            } catch (NamingException ex) {
                ex.printStackTrace();
            }
            return;
        }
        // Si se desconoce la operacion recibida
        this.doDesconocida(peticion, respuesta);
        return;
    }

    public void doLogOut(HttpServletRequest peticion, HttpServletResponse respuesta) throws ServletException, IOException {
        RequestDispatcher rd = sc.getRequestDispatcher("/index.jsp");
        rd.forward(peticion, respuesta);
    }

    public void doEditarDatos(HttpServletRequest peticion, HttpServletResponse respuesta) throws ServletException, IOException {
        /*Usuario usuario = new Usuario();
        usuario.setNombre(peticion.getParameter("nombre"));
        usuario.setEmail(peticion.getParameter("email"));
        usuario.setPassword(peticion.getParameter("password"));*/
        RequestDispatcher rd = sc.getRequestDispatcher("/editarDatosUsuario.jsp?nombre=" + usuario.getNombre() + "&email=" + usuario.getEmail() + "&apellidos" + usuario.getApellidos() + "&nombre=" + usuario.getNombre());
        rd.forward(peticion, respuesta);
    }

    /*public void doLogOut(HttpServletRequest petiocion, HttpServletResponse respuesta) throws ServletException,IOException, NamingException{

    }*/
    private void doVerMensajes(HttpServletRequest peticion, HttpServletResponse respuesta) throws ServletException, IOException, NamingException {
        //RecuperarFicherosBean sf = new RecuperarMssBean();  TODO
        System.err.println("Control --> doVerMss1");

        System.err.println("Control --> doVerMss2");
        InitialContext context = new InitialContext();
        System.err.println("Control --> doVerMss3");
        //recuperar_mensajes = ()context.lookup("recuperar_mensajes.RecuperarMssBeanRemote");
        boolean resultado = true; //= recuperar_mensajes.recuperarMensajes(usuario);
        System.err.println("Control --> doVerMss4");
        if (resultado) {
            System.err.println("Control servlet en doVerMss bien");
            //ArrayList al =usuario.getFicheros();
            peticion.setAttribute("contenedor", usuario.getFicheros());
            //System.out.println("Numero de ficheros de " + usuario.getNombre() + " --> " + usuario.getNumFicheros());
            RequestDispatcher rd = sc.getRequestDispatcher("/mensajes.jsp");
            //RequestDispatcher rd = sc.getRequestDispatcher("/ficheros.jsp?contenedor=" + usuario.getNombre());
            rd.forward(peticion, respuesta);
        } else {
            System.err.println("Control servlet en doSubirFichero mal");
            RequestDispatcher rd = sc.getRequestDispatcher("/PrincipalUsuario.jsp");
            rd.forward(peticion, respuesta);
        }
    }

    private void doDescargarFichero(HttpServletRequest peticion, HttpServletResponse respuesta) throws ServletException, IOException {
        System.err.println("Control servlet en doDescargarFichero");
        String numero_fichero = peticion.getParameter("doc");
        System.out.println("Numero de fichero --> " + numero_fichero);
        RequestDispatcher rd = sc.getRequestDispatcher("/fichero.jsp");
        rd.forward(peticion, respuesta);

    }

    private void doRecordarPassword(HttpServletRequest peticion, HttpServletResponse respuesta) throws ServletException, IOException {
        System.out.println(peticion.getParameter("email"));
        loginBean.recordarPassword(peticion.getParameter("email"));
    }

    private void doVerFicheros(HttpServletRequest peticion, HttpServletResponse respuesta) throws ServletException, IOException {

        boolean resultado = recuperarFicheroBean.ver(usuario);
        System.err.println("Control servlet en doVerFichero5");
        if (resultado) {
            System.err.println("Control servlet en doVerFichero bien");
            //ArrayList al =usuario.getFicheros();
            peticion.setAttribute("contenedor", usuario.getFicheros());
            System.out.println("Numero de ficheros de " + usuario.getNombre() + " --> " + usuario.getNumFicheros());
            RequestDispatcher rd = sc.getRequestDispatcher("/ficheros.jsp");
            //RequestDispatcher rd = sc.getRequestDispatcher("/ficheros.jsp?contenedor=" + usuario.getNombre());
            rd.forward(peticion, respuesta);

        } else {
            System.err.println("Control servlet en doSubirFichero mal");
            RequestDispatcher rd = sc.getRequestDispatcher("/PrincipalUsuario.jsp");
            rd.forward(peticion, respuesta);
        }
    }

    private void doSubirFichero(HttpServletRequest peticion, HttpServletResponse respuesta) throws ServletException, IOException {
        System.err.println("Control servlet en doSubirFichero");
        Documento documento = new Documento();
        System.err.println("Control servlet en doSubirFichero1");
        String archivo = peticion.getParameter("archivo");
        System.err.println("Control servlet en doSubirFichero2 --> " + archivo);
        documento.setFichero(archivo);
        System.err.println("Control servlet en doSubirFichero3");

        System.err.println("Control servlet en doSubirFichero4");
        boolean resultado = subirFicheroBean.subir(documento);
        System.err.println("Control servlet en doSubirFichero5");
        if (resultado) {
            System.err.println("Control servlet en doSubirFichero bien");
            RequestDispatcher rd = sc.getRequestDispatcher("/principalUsuario.jsp");
            rd.forward(peticion, respuesta);

        } else {
            System.err.println("Control servlet en doSubirFichero mal");
            RequestDispatcher rd = sc.getRequestDispatcher("/index.jsp");
            rd.forward(peticion, respuesta);
        }
    }

    private void doLogin(HttpServletRequest peticion, HttpServletResponse respuesta) throws ServletException, IOException {

        //usuario.setLogin(peticion.getParameter("login"));
        usuario.setEmail(peticion.getParameter("login"));
        usuario.setPassword(peticion.getParameter("password"));
        System.out.println("email --> " + usuario.getEmail() + "; pass --> " + usuario.getPassword());
        System.out.println("control.dologin --> antes de comprobar");
        loginBean = new LoginBean();
        Usuario usuarioLogueado = loginBean.comprobar(usuario);
        System.out.println("control.dologin --> comprobamos");
        if (usuarioLogueado.getNombre().equals("")) {
            RequestDispatcher rd = sc.getRequestDispatcher("/index.jsp");
            rd.forward(peticion, respuesta);
        } else {
            usuario = usuarioLogueado;
            String usu = usuario.getNombre();
            //peticion.setAttribute(usu);
            RequestDispatcher rd = sc.getRequestDispatcher("/principalUsuario.jsp?usu=" + usu);
            rd.forward(peticion, respuesta);
            //RequestDispatcher rd = request.getRequestDispatch("url?newparam=newvalue");
            //rd.forward(request, response);
            //peticion.setAttribute("nombre_usuario", usu);
            sc.setInitParameter("nombre_usuario", usu);
        }
    }

    private void doAltaUsuario(HttpServletRequest peticion, HttpServletResponse respuesta) throws ServletException, IOException {
        usuario.setNombre(peticion.getParameter("nombre"));
        usuario.setEmail(peticion.getParameter("email"));
        usuario.setPassword(peticion.getParameter("password"));
        usuario.setApellidos("m");
        altaBean = new AltaBean();
        boolean resultado = altaBean.alta(usuario);

        if (resultado) {
            System.out.println("usuario --> " + usuario.getNombre());
            RequestDispatcher rd = sc.getRequestDispatcher("/principalUsuario.jsp?usu=" + usuario.getNombre());
            rd.forward(peticion, respuesta);
        } else {
            RequestDispatcher rd = sc.getRequestDispatcher("/index.jsp");
            rd.forward(peticion, respuesta);
        }
    }

    private void doRegistrarse(HttpServletRequest peticion, HttpServletResponse respuesta) throws ServletException, IOException {
        RequestDispatcher rd = sc.getRequestDispatcher("/Registrarse.jsp");
        rd.forward(peticion, respuesta);
    }

    /*private void doLogin(HttpServletRequest peticion, HttpServletResponse respuesta) throws ServletException, IOException {
    RequestDispatcher rd = sc.getRequestDispatcher("/login.jsp");
    rd.forward(peticion, respuesta);
    }*/
    private void doDesconocida(HttpServletRequest peticion, HttpServletResponse respuesta) throws ServletException, IOException {
        RequestDispatcher rd = sc.getRequestDispatcher("/error.jsp");
        rd.forward(peticion, respuesta);
    }

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            /* TODO output your page here
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet Control</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Servlet Control at " + request.getContextPath () + "</h1>");
            out.println("</body>");
            out.println("</html>");
             */
        } finally {
            out.close();
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
        //email = request.getParameter("email");
        //pass = request.getParameter("pass");
    }
    /*public void doPost(HttpServletRequest request,
    HttpServletResponse response)
    throws ServletException, IOException {
    doGet(request, response);
    }

    public void doGet(HttpServletRequest request,
    HttpServletResponse response)
    throws ServletException, IOException {
    request.getParameter("login");
    request.getParameter("password");
    }*/

    /**
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}
